/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.replica.replicaisland;

import java.lang.reflect.InvocationTargetException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

public class AnimationPlayerActivity extends Activity {
	public static final int KYLE_DEATH = 0;
	public static final int WANDA_ENDING = 1;
	public static final int KABOCHA_ENDING = 2;
	public static final int ROKUDOU_ENDING = 3;

	private AnimationDrawable mAnimation;
	private int mAnimationType;
	private long mAnimationEndTime;

	private KillActivityHandler mKillActivityHandler = new KillActivityHandler();

	class KillActivityHandler extends Handler {

		@Override
		public void handleMessage(Message msg) {
			AnimationPlayerActivity.this.finish();
			if (UIConstants.mOverridePendingTransition != null) {
				try {
					UIConstants.mOverridePendingTransition.invoke(
							AnimationPlayerActivity.this,
							R.anim.activity_fade_in, R.anim.activity_fade_out);
				} catch (InvocationTargetException ite) {
					DebugLog.d("Activity Transition",
							"Invocation Target Exception");
				} catch (IllegalAccessException ie) {
					DebugLog.d("Activity Transition",
							"Illegal Access Exception");
				}
			}
		}

		public void sleep(long delayMillis) {
			this.removeMessages(0);
			sendMessageDelayed(obtainMessage(0), delayMillis);
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		final Intent callingIntent = getIntent();
		mAnimationType = callingIntent.getIntExtra("animation", KYLE_DEATH);

		if (mAnimationType == KYLE_DEATH) {
			setContentView(R.layout.animation_player);

			ImageView canvasImage = (ImageView) findViewById(R.id.animation_canvas);
			canvasImage.setImageResource(R.anim.kyle_fall);
			mAnimation = (AnimationDrawable) canvasImage.getDrawable();
		} else {

			if (mAnimationType == WANDA_ENDING
					|| mAnimationType == KABOCHA_ENDING) {
				float startX = 0.0f;
				DisplayMetrics metrics = new DisplayMetrics();
				getWindowManager().getDefaultDisplay().getMetrics(metrics);
				if (mAnimationType == WANDA_ENDING) {
					setContentView(R.layout.good_ending_animation);
					startX = 200 * metrics.density;

				} else {
					setContentView(R.layout.kabocha_ending_animation);
					startX = -200 * metrics.density;
				}

				// HACK
				// the TranslateAnimation system doesn't support device
				// independent pixels.
				// So for the Wanda ending and Kabocha endings, in which the
				// game over text
				// scrolls in horizontally, compute the size based on the actual
				// density of
				// the display and just generate the anim in code. The Rokudou
				// animation
				// can be safely loaded from a file.
				Animation gameOverAnim = new TranslateAnimation(startX, 0, 0, 0);
				gameOverAnim.setDuration(6000);
				gameOverAnim.setFillAfter(true);
				gameOverAnim.setFillEnabled(true);
				gameOverAnim.setStartOffset(8000);

				View background = findViewById(R.id.animation_background);
				View foreground = findViewById(R.id.animation_foreground);
				View gameOver = findViewById(R.id.game_over);

				Animation foregroundAnim = AnimationUtils.loadAnimation(this,
						R.anim.horizontal_layer2_slide);
				Animation backgroundAnim = AnimationUtils.loadAnimation(this,
						R.anim.horizontal_layer1_slide);

				background.startAnimation(backgroundAnim);
				foreground.startAnimation(foregroundAnim);
				gameOver.startAnimation(gameOverAnim);

				mAnimationEndTime = gameOverAnim.getDuration()
						+ System.currentTimeMillis();
			} else if (mAnimationType == ROKUDOU_ENDING) {
				setContentView(R.layout.rokudou_ending_animation);
				View background = findViewById(R.id.animation_background);
				View sphere = findViewById(R.id.animation_sphere);
				View cliffs = findViewById(R.id.animation_cliffs);
				View rokudou = findViewById(R.id.animation_rokudou);
				View gameOver = findViewById(R.id.game_over);

				Animation backgroundAnim = AnimationUtils.loadAnimation(this,
						R.anim.rokudou_slide_bg);
				Animation sphereAnim = AnimationUtils.loadAnimation(this,
						R.anim.rokudou_slide_sphere);
				Animation cliffsAnim = AnimationUtils.loadAnimation(this,
						R.anim.rokudou_slide_cliffs);
				Animation rokudouAnim = AnimationUtils.loadAnimation(this,
						R.anim.rokudou_slide_rokudou);
				Animation gameOverAnim = AnimationUtils.loadAnimation(this,
						R.anim.rokudou_game_over);

				background.startAnimation(backgroundAnim);
				sphere.startAnimation(sphereAnim);
				cliffs.startAnimation(cliffsAnim);
				rokudou.startAnimation(rokudouAnim);
				gameOver.startAnimation(gameOverAnim);
				mAnimationEndTime = gameOverAnim.getDuration()
						+ System.currentTimeMillis();
			} else {
				assert false;
			}

		}

		// Pass the calling intent back so that we can figure out which
		// animation just played.
		setResult(RESULT_OK, callingIntent);

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		long time = System.currentTimeMillis();
		if (time > mAnimationEndTime) {
			finish();
		} else {
			try {
				Thread.sleep(32);
			} catch (InterruptedException e) {
				// Safe to ignore.
			}
		}
		return true;
	}

	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		if (hasFocus && mAnimation != null) {
			mAnimation.start();
			mKillActivityHandler.sleep(mAnimation.getDuration(0)
					* mAnimation.getNumberOfFrames());
		}
	}

}
